#include "stdafx.h"
#include "Rationnel.h"
#include<sstream>

int gcd(int a, int b)
{	int r;
	
	while(b>0){
		r = a % b;
		a = b;
		b=r;
	}
	return(a);
}
 
void Rationnel::canonise()
{
	int d = gcd(abs(_num),abs(_den));
	if(d!=1) {_num=_num/d; _den=_den/d;}
}

Rationnel::Rationnel()
{
	_num=0;
	_den=1;
}

Rationnel::Rationnel(int N)
{

	_num = N;
	_den = 1;
}

Rationnel::Rationnel(int N,int D)
{
	// si Rationnel negatif, le signe est au numerateur
	if(D<0)
	{ 
		_den = D*(-1);
		_num = N*(-1);
	}
	else
	{
		_den = D;
		_num = N;
	}
	canonise();
}

Rationnel::Rationnel(const Rationnel & r)
{
	_den=r._den;
	_num=r._num;
}

Rationnel & Rationnel::operator=(const Rationnel & r)
{
	if(this!=&r)
	{
		_den=r._den;
		_num=r._num;
	}
	return *this;
}


std::ostream & operator<<(std::ostream & flot,const Rationnel & R)
{
	if(R.GetDenominateur()== 1)
	{
		flot << R.GetNumerateur();
	}
	else
	{
		flot << R.GetNumerateur()<< "/" << R.GetDenominateur();
	}
	return flot;
}

std::string Rationnel::ToString() const
{
	std::stringstream ss;
	ss<<(*this);
	return ss.str();
}


Rationnel Rationnel::operator+(const Rationnel & r) const
{
	Rationnel local((_num * r._den) 
		+ (r._num * _den),_den*r._den);
	return local;
}

Rationnel Rationnel::operator-(const Rationnel & r) const
{
	Rationnel local(r._num*(-1),r._den);
	return ((*this)+local);
}

Rationnel Rationnel::operator*(const Rationnel & r) const
{
	Rationnel local(_num * r._num,_den*r._den);
	return local;
}

Rationnel Rationnel::operator/(const Rationnel & r) const
{
	Rationnel inv(r._den,r._num);
	return (*this)*inv;
}

bool Rationnel::operator==(const Rationnel & r) const
{
	return ((_num==r._num) & (_den==r._den));
}	


bool Rationnel::operator>(const Rationnel & r) const
{
	return (((double)_num)/_den)>(((double)r._num)/r._den);
}	
	
bool Rationnel::operator<(const Rationnel & r) const
{
	return (r>(*this));
}	

bool Rationnel::operator>=(const Rationnel & r) const
{
	return !(r>(*this));
}	

bool Rationnel::operator<=(const Rationnel & r) const
{
	return !((*this)>r);
}	

